package com.bblocks.common.anti_reptile.config.bean;

import com.bblocks.common.anti_reptile.constant.RuleTypeEnum;
import lombok.Data;

import java.util.concurrent.TimeUnit;

import  com.bblocks.common.anti_reptile.constant.AntiReptileConsts;

/**
 * <p>Project: bb-anti-reptile - RuleComm</p>
 * <p>描述：通用规则属性</p>
 *
 * @Author Zhao [125043150@qq.com]
 * @Date 2024/3/22 16:52
 * @Version 1.0
 * @since 8
 */
@Data
public class RuleComm {

    /**
     * 规则类型
     */
    private RuleTypeEnum ruleTypeEnum;

    /**
     * 是否启用 Rule：默认停用
     */
    private boolean enabled = false;

    /**
     * 提取用户tokenkey（必须），否则将认为是非登录状态，默认：Authorization
     */
    private String tokenKey = "Authorization";

    /**
     * 时间窗口：默认5000ms
     */
    private Integer expirationTime = 5000;

    /**
     * 时间窗口最大请求数(设置值/默认值)
     */
    private Integer requestMaxSize ;

    /**
     * 锁定类型：1=限流 2=验证码（默认 锁定时间结束或者验证码解锁） 3=拉黑（锁定时间结束或者管理平台手工解锁）
     */
    private Integer lockType = 2;

    /**
     * 命中规则后，锁定期限,默认1天，单位：秒（s）,仅限lockType =1/2/3有效，建议验证码锁定10分钟，拉黑设置1天,限流量：10秒？
     */
    private long lockExpire = TimeUnit.DAYS.toSeconds(1);

    /**
     * 倍率-仅限计算系数(默认200)
     * 实际的最大流量：RuleVO.rateMax * multiplier / RuleComm.expirationTime
     */
    private double multiplier = 200.0;

    /**
     * lockType后的错误提醒json（主要是定制错误码）,默认：{"code":0,"msg":"操作成功!","serviceTips":"操作成功!","sucFlag":true}
     */
    private String lockResponse = AntiReptileConsts.JSON_RET;

    /**
     * 默认qps（null/0/正数）
     * @return
     */
    public Integer defaultQps(){
        if(requestMaxSize == null || expirationTime == null
            || requestMaxSize < 0 || expirationTime <= 0){
            return null;
        }
        return requestMaxSize / (expirationTime/1000);
    }

}
